#! /usr/bin/env python3

import sys

import gi
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QLabel, QListWidget, QHBoxLayout, \
    QVBoxLayout, QSizePolicy, QFrame

from block_user import BlockUser
from browsers_incognito import AllBrowsersIncognito
from enable_grub import EnableGrub
from hp_freeze import HPFreezeWindow
from mos_appstore_rules import MosAppstoreRules
from mos_authorization import MosAuthorization
from nmcli import NetworkInterface
from recreate_user import RecreateUser
from restrict_wifi import RestrictWifi
from shutdown_pause import ShutdownPause

gi.require_version('Polkit', '1.0')
authorized = False
version = '2.1'


class MainWindow(QMainWindow):

    def do_action(self):
        if self.menu_list.selectedIndexes():
            self.second_column_layout.itemAt(0).widget().deleteLater()
            try:
                self.action_button.clicked.disconnect()
            except Exception:
                pass
            classes = (
                NetworkInterface,
                AllBrowsersIncognito,
                EnableGrub,
                MosAuthorization,
                BlockUser,
                RecreateUser,
                HPFreezeWindow,
                MosAppstoreRules,
                RestrictWifi,
                ShutdownPause
            )
            functions = (
                'set_ip',
                'browsers_action',
                'grub_action',
                'mos_authorization_action',
                'block_user_action',
                'recreate_user',
                'freeze_hp',
                'change_appstore_rules',
                'restrict_wifi',
                'change_time_to_shutdown'
            )
            self.action_widget = classes[self.menu_list.selectedIndexes()[0].row()]()
            self.action_button.clicked.connect(
                self.action_widget.__getattribute__(functions[self.menu_list.selectedIndexes()[0].row()]))

            self.second_column_layout.insertWidget(0, self.action_widget)

    def update_info(self):
        if self.menu_list.selectedIndexes():
            self.info_label.setText(self.info_labels[self.menu_list.selectedIndexes()[0].row()])

    def __init__(self):
        super().__init__()

        self.setWindowTitle(f"Admin Tweak ver. {version}")
        self.setGeometry(500, 400, 1200, 900)
        central_widget = QWidget()
        central_widget_layout = QHBoxLayout()
        central_widget.setLayout(central_widget_layout)
        self.menu_list = QListWidget()
        self.menu_list.addItems([
            'Настроить соединение интерактивной панели с Android',
            'Инкогнито для браузеров',
            'Настройки GRUB',
            'Авторизация через MOS.RU',
            'Блокировка рабочего стола выбранной учётной записи',
            'Пересоздание учётной записи',
            'Пакет HPLIP',
            'Доступ к Магазину',
            'Ограничение Wi-Fi',
            'Выключение и перезагрузка'
        ])
        self.info_labels = [
            "Устанавливает ipv4 192.168.254.253/24 для выбранного интерфейса",
            "Позволяет переключить обычный режим и режим инкогнито для браузеров по умолчанию",
            "Позволяет убрать отображение меню GRUB при загрузке ПК",
            "Позволяет включить авторизацию в системе через mos.ru",
            "Защищает рабочий стол и настройки пользователя от изменений",
            "Позволяет пересоздать выбранную учётную запись",
            "Позволяет отключить обновление плагина HP при обновлении драйвера",
            "Позволяет установить права пользователям и группам на запуск Магазина",
            "Позволяет запрашивать пароль администратора при подключении к wi-fi сетям",
            "Позволяет выбрать паузу в секундах между выбором пункта меню Завершение работы и выключением компьютера"
        ]

        central_widget_layout.addWidget(self.menu_list)
        self.menu_list.setFixedWidth(self.width() // 2)
        self.menu_list.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred)
        second_column = QWidget()
        self.second_column_layout = QVBoxLayout()
        second_column.setLayout(self.second_column_layout)

        central_widget_layout.addWidget(second_column)

        self.action_widget = NetworkInterface()
        self.second_column_layout.addWidget(self.action_widget)

        self.info_label = QLabel()
        self.info_label.setWordWrap(True)
        self.info_label.setAlignment(Qt.AlignBottom | Qt.AlignCenter)
        self.second_column_layout.addWidget(self.info_label)
        self.menu_list.setCurrentRow(0)
        self.update_info()
        self.menu_list.itemSelectionChanged.connect(self.update_info)

        line = QFrame()
        line.setFrameShape(QFrame.HLine)
        line.setFrameShadow(QFrame.Sunken)
        line.setLineWidth(1)
        self.second_column_layout.addWidget(line, Qt.AlignCenter)

        self.action_button = QPushButton('Применить')
        self.second_column_layout.addWidget(self.action_button)
        self.action_button.clicked.connect(self.action_widget.set_ip)
        self.menu_list.itemSelectionChanged.connect(self.do_action)
        self.setCentralWidget(central_widget)
        self.setWindowIcon(QIcon(QIcon.fromTheme('admin-tweak')))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()
